﻿#ifndef FIMAGEVIEW_H
#define FIMAGEVIEW_H

#include <QGraphicsView>
#include <QGraphicsPixmapItem>
#include <QGraphicsScene>
#include <QImage>

// FImageView
// 一个现代化的可缩放、可拖拽的图片查看控件（.h/.cpp 合并在同一个文档中）
// 特性：
//  - 鼠标滚轮以光标为中心缩放（支持平滑缩放、最大/最小缩放限制）
//  - 鼠标按下拖拽平移（按住空格键也可以切换为抓手模式）
//  - 双击自适应窗口
//  - 支持设置背景圆角、阴影（通过 Qt 效果）
//  - 提供常用 API：setImage / clear / fitToWindow / setZoom

class FImageView : public QGraphicsView
{
    Q_OBJECT
public:
    explicit FImageView(QWidget *parent = nullptr);
    ~FImageView() override = default;

    // 设置图片
    void setImage(const QImage &img, bool autoFit=true);
    void setPixmap(const QPixmap &pixmap, bool autoFit=true);
    void clear();

    // 缩放控制（绝对）
    void setZoom(qreal scale); // 以 1.0 为原始大小
    qreal zoom() const { return m_currentScale; }

    // 适应窗口
    void fitToWindow();

    // 缩放限制
    void setZoomRange(qreal minScale, qreal maxScale);

signals:
    void zoomChanged(qreal newScale);

protected:
    // 事件覆盖
    void wheelEvent(QWheelEvent *event) override;    // 鼠标滚轮缩放
    void mousePressEvent(QMouseEvent *event) override; // 拖拽开始
    void mouseMoveEvent(QMouseEvent *event) override;  // 拖拽中
    void mouseReleaseEvent(QMouseEvent *event) override; // 拖拽结束
    void mouseDoubleClickEvent(QMouseEvent *event) override; // 双击自适应
    void resizeEvent(QResizeEvent *event) override;

private:
    QGraphicsScene *m_scene = nullptr;
    QGraphicsPixmapItem *m_pixmapItem = nullptr;

    // 缩放状态
    qreal m_currentScale = 1.0;
    qreal m_minScale = 0.1;
    qreal m_maxScale = 10.0;

    // 拖拽状态
    bool m_dragging = false;
    QPoint m_lastMousePos;

    void applyScale(qreal factor, const QPointF &anchorInView);
    void updateViewportHints();
};


#endif // FIMAGEVIEW_H
